'''
* This is the projet for Brtc LlmOps Platform
* @Author Leon-liao <liaosiliang@alltman.com>
* @Description //TODO 
* @File: 2_study_embedding_cache.py
* @Time: 2025/10/27
* @All Rights Reserve By Brtc
'''
import dotenv
import numpy as np
from langchain.embeddings import CacheBackedEmbeddings
from langchain.storage import LocalFileStore
from langchain_openai.embeddings import OpenAIEmbeddings
from numpy.linalg import norm

dotenv.load_dotenv()
def cosine_similarity(v1:list, v2:list) -> float:
    # 1、计算两个向量的点积
    dot_product = np.dot(v1, v2)
    # 2、计算两个向量的长度
    v1_len = norm(v1)
    v2_len = norm(v2)
    #计算余弦
    return dot_product / (v1_len * v2_len)
#1、创建文本模型
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
#2、配置缓存
embedding_with_cache = CacheBackedEmbeddings.from_bytes_store(
    embeddings,
    LocalFileStore("./cache"),
    namespace=embeddings.model,
    query_embedding_cache=True
)
#2、嵌入文本
query_vector = embedding_with_cache.embed_query("我叫博小睿,我喜欢篮球")
print(len(query_vector))
print(query_vector)
#3、嵌入列表
document_vector = embedding_with_cache.embed_documents([
    "我叫博小睿,喜欢的运动是篮球",
    "有何很帅的男人喜欢打篮球，他的名叫博小睿",
    "廖老师说过，现在学AI等于捡钱"
])
print(len(document_vector))
for one in  document_vector:
    print("========================")
    print(one)

# 计算相似度
print("向量1-------->向量2 的相似度", cosine_similarity(document_vector[0], document_vector[1]))
print("向量1-------->向量3 的相似度", cosine_similarity(document_vector[0], document_vector[2]))
print("向量2-------->向量3 的相似度", cosine_similarity(document_vector[1], document_vector[2]))